package com.chen.utils;

import com.chen.entity.Menu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 使用递归获取菜单树
 */
public class MenuTreeBuilder {
    public static List<Menu> build(List<Menu> rootMenu){
        rootMenu.forEach(menu -> {
            System.out.println(menu.toString());
        });
        //定义一个最终的结果
        List<Menu> menuList=new ArrayList<>();
        //先找到所有的一级菜单
        for (Menu menu:rootMenu){
            if (menu.getParentId()==0){
                //将一级菜单添加到集合中
                menuList.add(menu);
            }
        }

        //在这里需要进行排序
        Collections.sort(menuList,Menu.order());


        //为一级菜单设置子菜单，getChild处递归调用的
        //现在循环的都是一级菜单
        for (Menu menu:menuList){
            menu.setChildMenus(getChild(menu.getId(),rootMenu));
        }
        return menuList;
    }

    private static List<Menu> getChild(Long id, List<Menu> rootMenu) {
        List<Menu> childMenus=new ArrayList<>();
        for (Menu menu:rootMenu){
            //循环所有的菜单,如果父级菜中==id 并且类型肯定要为0
            if (menu.getParentId().equals(id) && menu.getType().equals("0")){
                //说明当前的菜单就是传过来的menu的子菜单
                childMenus.add(menu);
            }
        }

        //在这里需要进行排序
        Collections.sort(childMenus,Menu.order());

        //这样就是为子菜单再设置子菜单
        for (Menu menu:childMenus){
            menu.setChildMenus(getChild(menu.getId(),rootMenu));
        }
        //递归退出条件
        if (childMenus.size()==0){
            return new ArrayList<>();
        }
        return childMenus;
    }
}